import {
    __commonWrap,
    objNum2String
} from '../helper'
//import {getAppConfigHook} from '../helper/config'
import rpchook from '@/common/core/bridge/hook/rpchook';
import {showLoading, hideLoading} from './interactive'

/**
  * 添加事件监听
  * @param {Object} options 监听属性
  * @param {Function} keepCallback 事件回调函数
  */
 export function addNotifyListener (options, keepCallback) {
    return __commonWrap('addNotifyListener', options, {keepCallback})
 }

/**
  * 远程过程调用
  * @param {String} operationType 远程请求名称
  * @param {Object} requestData 远程请求参数 key:value
  * @param {Object} options 远程调用选项
  * @param {number} encryptType （encryptType）加密方式：
      * 0：不需要加密
      * 1：rsa加密，格式为->"加密密钥"+"#"+"密文"
      * 2：rsa加密，格式为->md5("加密密钥"+"#"+"密文"+"#ebank123")+"加密密钥"+"#"+"密文"
      * 3：aes加密，格式为->base64("加密密文")
      * 4：aes加密，格式为->md5(base64("密文")+"#ebank123")+"#"+"密文"
  * @param {String} type 报文参数是否包含body,1:不包含 其他：包含
  * @param {String} token 长流程链路唯一标识
  */
 export function rpc (operationType, requestData = {}, encryptType = 0, type = '', token = '', options = {}) {

    let rpcInfo = {operationType, requestData, options};
    //rpcHook = getAppConfigHook('rpc')

    //预处理钩子
    rpchook.pre && rpchook.pre(rpcInfo,'rpc',token)

    //上送报文参数封装
    let requestBody = {
        data:type === '1' ? rpcInfo.requestData.body : rpcInfo.requestData,
        paramKey:type === '1' ? 'data' : '',
        encryptType:encryptType

    }
    console.log(requestBody,'requestBody')

    let rpcParams = {
        operationType: rpcInfo.operationType,
        requestData: [{'_requestBody': objNum2String(requestBody)}],
        timeout: options.timeout || 20,
        headers: options.headers
    }

    if(options.loading !== false) showLoading() 
    console.info(rpcParams)
    return __commonWrap('rpc', rpcParams).then((result) => {
        console.info(result)
        if(options.loading !== false) setTimeout(() => hideLoading(), 300)

        return new Promise((resolve, reject) => {
            //通过钩子能力对外暴露项目
            if(rpchook.post){
                //返回处理钩子
                rpchook.post({resolve, reject, rpcInfo, result})
            }else{
                resolve(result)
            }
        })
    }, () => {

        if(options.loading !== false) hideLoading()
    }).catch(() => {
        if(options.loading !== false) hideLoading()
    })
 }


    /**
     * httpRequest发送接口请求
     * @param {String} operationType 交易码，对应mpaas管理平台上的交易码
     * @param {Object} requestData 请求参数 key:value
     * @param {number} encryptType（encryptType）加密方式：
     * 0：不需要加密
     * 1：rsa加密，格式为->"加密密钥"+"#"+"密文"
     * 2：rsa加密，格式为->md5("加密密钥"+"#"+"密文"+"#ebank123")+"加密密钥"+"#"+"密文"
     * 3：aes加密，格式为->base64("加密密文")
     * 4：aes加密，格式为->md5(base64("密文")+"#ebank123")+"#"+"密文"
     * @param {String} type 报文参数是否包含body,1:不包含 其他：包含
     * @param {String} token 长流程链路唯一标识
     * @param {Object} options 请求选项，常用的loading，默认使用，可传false不展示loading
     * @returns {Promise} 参数为请求结果
     */
export function httpRequest (operationType, requestData = {}, encryptType = 0, type = '', token = '', options = {}) {
    console.log(token, '00000')
    let rpcInfo = { operationType, requestData, options };

    //预处理钩子
    rpchook.preHttpRequest && rpchook.pre(rpcInfo,'request',token);
    let rpcParams = {
        operationType: rpcInfo.operationType,
        requestData: [{ '_requestBody': objNum2String(rpcInfo.requestData) }],
        timeout: options.timeout || 55,
        head: options.headers,
        getResponse: true,
        url: rpcInfo.operationType,
        //encrypt: true,
        data: type === '1' ? rpcInfo.requestData.body : rpcInfo.requestData,
        paramKey: type === '1' ? 'data' : '',
        encryptType: encryptType
    };
    console.log('requestParams222: ', rpcInfo.requestData);
    if (options.loading !== false) this.showLoading();
    return __commonWrap('httpRequest', rpcParams).then((result) => {
        console.log(result, 'result')
        if (options.loading !== false) hideLoading();
        return new Promise((resolve, reject) => {

            if (rpchook.post) {
                //返回处理钩子
                rpchook.post({ api: { alert: this.alert, loginOut: this.loginOut }, resolve, reject, rpcInfo, result });
            } else {
                resolve(result);
            }

        });
    }, () => {
        if(options.loading !== false) hideLoading()
    });
}

/**
 * 设置webview的usagent模式
 * @param {String} usagent usagent串
*/
export function debugMode (usagent) {
    return __commonWrap('debugMode', {usagent})
}

/**
 * 打开通讯录列表
 * @param {Object} options 通讯录配置项
*/
export function showContactList ({maxSeletedNum = 1, contactList}) {
    return __commonWrap('showContactList', {maxSeletedNum, contactList})
}

/**
 * 截屏
 * @param {String} type 截屏类型 0 - 默认全屏截屏1 - WebView截屏2 - WebView长图截屏
*/
export function screenShots (type) {
    return __commonWrap('screenShots', {type})
}

/**
 * 设置剪贴板
 * @param {String} copyString 复制到手机系统剪切板的字符串
*/
export function copyToClipboard (copyString = '') {
    return __commonWrap('copyToClipboard', {copyString})
}

/**
 * 发送短信
 * @param {Object} options 发送短信配置项
*/
export function sendSMS ({mobileNo, content}) {
    return __commonWrap('sendSMS', {mobileNo, content})
}

/**
 * 发送邮件
 * @param {Object} options 发送邮件配置项
*/
export function sendMail (options) {
    return __commonWrap('sendMail', options)
}

/**
 * 打开相册/拍照界面
*/
export function showCameraImagePicker () {
    return __commonWrap('showCameraImagePicker')
}

/**
 * 获取定位信息
*/
export function getLocationInfo () {
    return __commonWrap('getLocationInfo')
}

/**
 * 设置屏幕亮度
 * @param {Number} brightParams 亮度值  0 - 1
*/
export function setBrightness (brightParams) {
    return __commonWrap('setBrightness', {brightParams})
}

/**
 * 恢复屏幕亮度
*/
export function recoverBrightness () {
    return __commonWrap('recoverBrightness')
}

/**
 * 下载PDF
 * @param {String} url pdf下载地址
*/
export function downloadPdf (url) {
    return __commonWrap('downloadPdf', {url})
}

/**
 * 中文转大写拼音
 * @param {String} chineseString 待转中文字符串
*/
export function chinese2MandarinLatin (chineseString) {
    return __commonWrap('chinese2MandarinLatin', {chineseString})
}

/**
 * 打开第三方APP
 * @param {String} schemeURL 第三方APP地址
*/
export function startOtherApp (options) {
    return __commonWrap('startOtherApp', options)
}

/**
 * 检测是否支持ApplePay
*/
export function availableApplePay () {
    return __commonWrap('availableApplePay').then(res => res.result)
}

/**
 * 检测推送通知权限
*/
export function notificationStatus () {
    return __commonWrap('notificationStatus').then(res => res.notificationStatus)
}

/**
 * 检测定位权限
*/
export function availableLocationServices () {
    return __commonWrap('availableLocationServices').then(res => res.isLocationServicesEnabled)
}

/**
 * 打开定位设置
*/
export function openLocationSettings () {
    return __commonWrap('openLocationSettings')
}

/**
 * 打开系统浏览器
 * @param {String} url 访问url
*/
export function openNativeWebBrowser (url) {
    return __commonWrap('openNativeWebBrowser', {url})
}

/**
 * 增加日历提醒 
 * @param {Object} options 日历提醒配置项
*/
export function addCalendarReminder (options) {
    return __commonWrap('addCalendarReminder', options)
}

/**
 * 拨打电话
 * @param {String} phoneNumber 手机号码
*/
export function callPhoneNumber (phoneNumber) {
    return __commonWrap('callPhoneNumber', {phoneNumber})
}

/**
 * 检测是否已安装APP
 * @param {Object} options url配置信息
*/
export function isInstallApp (options) {
    return __commonWrap('isInstallApp', options)
}

/**
 * 检测GPS是否可用
*/
export function availableGPS () {
    return __commonWrap('availableGPS').then(result => result.availableGPS)
}

/**
 * 检测本地指纹/面容识别是否可用
*/
export function availableLocalAuthentication () {
    return __commonWrap('availableLocalAuthentication').then(result => result.available)
}

/**
 * 开始本地指纹/面容识别
*/
export function startLocalAuthentication (options) {
    return __commonWrap('startLocalAuthentication', options)
}

/**
 * 获取本地指纹/面容识别开启
 * @param {String} type 开关标识 login 登录 pay 支付
*/
export function getLocalAuthenticationOnOff (type) {
    type = type == 'login' ? '0' : (type == 'pay' ? '1' : type)
    return __commonWrap('getLocalAuthenticationOnOff', {type})
}

/**
 * 设置本地指纹/面容识别开启
 * @param {String} type 开关标识 login 登录 pay 支付
*/
export function setLocalAuthenticationOnOff (type) {
    type = type == 'login' ? '0' : (type == 'pay' ? '1' : type)
    return __commonWrap('setLocalAuthenticationOnOff', {type})
}

/**
 * 清除本地指纹/面容识别开启
 * @param {String} type 开关标识 login 登录 pay 支付
*/
export function clearLocalAuthenticationOnOff (type) {
    type = type == 'login' ? '0' : (type == 'pay' ? '1' : type)
    return __commonWrap('clearLocalAuthenticationOnOff', {type})
}

/**
 * 设置指纹/面容识别token
 * @param {String} token 设置指纹会话令牌
*/
export function setFingerPrintToken (token) {
    return __commonWrap('setFingerPrintToken', {token})
}


/**
 * 获取手势开启
*/
export function getGestureOnOff () {
    return __commonWrap('getGestureOnOff')
}

/**
 * 获取手势路径是否显示
*/
export function getGesturePathShowState () {
    return __commonWrap('getGesturePathShowState')
}

/**
 * 设置手势路径是否显示
 * @param {Boolean} gesturePathShow 手势路劲是否显示 true显示 false不显示
*/
export function setGesturePathShowState (gesturePathShow) {
    return __commonWrap('setGesturePathShowState', {gesturePathShow})
}

/**
 * 打开手势设置
 * @param {String} type 手势开启方式 1 - 进入设置手势密码 2 - 进入修改手势密码 3 - 清除手势密码
*/
export function pushGestureSetting (type) {
    return __commonWrap('pushGestureSetting', {type})
}

/**
 * 设置手势token
 * @param {String} token 手势会话令牌
*/
export function setGestureToken (token) {
    return __commonWrap('setGestureToken', {token})
}
